#!/usr/bin/env python3
"""
诊断AgentRole枚举与TaskAnalyzer中角色引用不匹配的问题
"""

import sys
import re
from pathlib import Path

def extract_agent_roles_from_enum():
    """从AgentRole枚举中提取所有定义的角色"""
    roles_file = Path("aiquant/agents/agent_roles.py")
    if not roles_file.exists():
        print(f"❌ 文件不存在: {roles_file}")
        return set()
    
    with open(roles_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 提取AgentRole枚举中的所有角色
    enum_pattern = r'class AgentRole\(Enum\):(.*?)(?=\n\n|\nclass|\n@|\Z)'
    enum_match = re.search(enum_pattern, content, re.DOTALL)
    
    if not enum_match:
        print("❌ 未找到AgentRole枚举定义")
        return set()
    
    enum_content = enum_match.group(1)
    
    # 提取角色名称
    role_pattern = r'(\w+)\s*=\s*"[^"]*"'
    roles = set(re.findall(role_pattern, enum_content))
    
    print(f"✅ 从AgentRole枚举中找到 {len(roles)} 个角色:")
    for role in sorted(roles):
        print(f"   - {role}")
    
    return roles

def extract_agent_roles_from_task_analyzer():
    """从TaskAnalyzer中提取所有引用的角色"""
    analyzer_file = Path("aiquant/coordination/task_analyzer.py")
    if not analyzer_file.exists():
        print(f"❌ 文件不存在: {analyzer_file}")
        return set()
    
    with open(analyzer_file, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 提取所有AgentRole.XXX的引用
    role_pattern = r'AgentRole\.(\w+)'
    roles = set(re.findall(role_pattern, content))
    
    print(f"\n✅ 从TaskAnalyzer中找到 {len(roles)} 个角色引用:")
    for role in sorted(roles):
        print(f"   - {role}")
    
    return roles

def find_mismatches():
    """找出不匹配的角色"""
    print("🔍 开始诊断AgentRole枚举与TaskAnalyzer角色引用不匹配问题...\n")
    
    enum_roles = extract_agent_roles_from_enum()
    analyzer_roles = extract_agent_roles_from_task_analyzer()
    
    if not enum_roles or not analyzer_roles:
        print("❌ 无法提取角色信息，诊断失败")
        return False
    
    # 找出TaskAnalyzer中引用但枚举中不存在的角色
    missing_in_enum = analyzer_roles - enum_roles
    
    # 找出枚举中存在但TaskAnalyzer中未引用的角色
    unused_in_analyzer = enum_roles - analyzer_roles
    
    print(f"\n📊 诊断结果:")
    print(f"   - AgentRole枚举中定义的角色: {len(enum_roles)}")
    print(f"   - TaskAnalyzer中引用的角色: {len(analyzer_roles)}")
    print(f"   - 不匹配的角色数量: {len(missing_in_enum)}")
    
    if missing_in_enum:
        print(f"\n❌ TaskAnalyzer中引用但AgentRole枚举中不存在的角色 ({len(missing_in_enum)}个):")
        for role in sorted(missing_in_enum):
            print(f"   - {role}")
    
    if unused_in_analyzer:
        print(f"\n⚠️  AgentRole枚举中存在但TaskAnalyzer中未使用的角色 ({len(unused_in_analyzer)}个):")
        for role in sorted(unused_in_analyzer):
            print(f"   - {role}")
    
    if not missing_in_enum:
        print("\n✅ 所有角色引用都匹配！")
        return True
    else:
        print(f"\n🎯 诊断结论: 发现 {len(missing_in_enum)} 个不匹配的角色引用")
        print("   这解释了为什么CoordinationEngine实例化时会出现AttributeError")
        return False

if __name__ == "__main__":
    success = find_mismatches()
    sys.exit(0 if success else 1)